<?php
// +----------------------------------------------------------------------
// | ManniuRead
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://manniuyun.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: heitao <read@manniuyun.com>
// +----------------------------------------------------------------------

namespace app\mall\model;

use manniu\model\Base;

use think\Cache;
use app\mall\model\MallCategory as MallCategoryModel;

class MallGoods extends Base{
	// 开启自动写入时间戳字段
	protected $autoWriteTimestamp = true;
	// 定义时间戳字段名
    protected $createTime = 'create_time';
    protected $updateTime = 'update_time';

    // 总销量 - 数据自动完成
    protected $insert = ['sale_count' => 0];

    /**
     * 商品价格 - 修改器
     */
    public function setShopPriceAttr($value){
        // 保留两位小数，之后四舍五入
        return sprintf("%.2f",$value);
    }

    /**
     * 市场价格 - 修改器
     */
    public function setMarketPriceAttr($value){
        // 保留两位小数，之后四舍五入
        return sprintf("%.2f",$value);
    }

    /**
     * 商品编号 - 修改器
     */
    public function setGoodsSnAttr($value){
        if(!$value){
            $value = 'GN'.date('Ymd').$this->builderRand();
        }
        return $value;
    }

    /**
     * 一对一关联商品附表
     */
    public function goodsData(){
        return $this->hasOne('MallGoodsData', 'goods_id', 'id')->bind(['goods_desc','goods_spec']);
    }

    /**
     * 商品图片 - 修改器
     */
    public function setGoodsImgAttr($value){
        return mn_array2string($value);
    }

    /**
     * 商品图片 - 获取器
     */
    public function getGoodsImgAttr($value){
        return mn_string2array($value);
    }

    /**
     * 栏目名称 - 获取器
     */
    public function getCatidAttr($value){
    	$value = (int)$value;
        if(!$value){
        	return '暂无分类';
        }
        // 调试模式实时查询
        $catname = '';
        if(config('app_debug')){
        	$categorys = MallCategoryModel::all(function($query){
                $query->field('id,name');
            });
        	foreach ($categorys as $key => $category) {
        		if($category->getAttr('id') == $value){
        			$catname = $category->getAttr('name');
        		}
        	}
        }else{
            // 部署模式使用缓存
            $categorys = cache('mall_categorys');
            if(isset($categorys[$value])){
                $catname = $categorys[$value]['name'];
            }
        }
        return $catname ? $catname : '暂无分类';
    }

    /**
     * 前端获取单个产品信息
     */
    public function getFrontGoodsInfo($id = 0){
        // 判断参数是否合法
        $id = (int)$id;
        if(!$id){
            return null;
        }
        // 部署模式读取缓存数据
        $goods = Cache::remember('goods_info_'.$id,function() use ($id){
            // 查询数据
            $goods = $this->where(['id'=>$id,'status'=>1,'is_sale'=>1])->cache(true,600)->find();
            if(!$goods){
                return null;
            }
            // 组合组表与附表数据
            $goods_data = $goods->goods_data->toArray();
            $goods = $goods->toArray();
            return $goods;
        });
        return $goods ? $goods : null;
    }

    /**
     * 后台设置规格加价时的验证器，同时格式化金额，四舍五入保留两位小数
     * @access public
     * @return bool
     */
    public function specMarkupValidate($specs = []){
        if(empty($specs)){
            return true;
        }
        if(count($specs)>1){
            return false;
        }
        $data = [];
        foreach ($specs as $spec_k => $spec_v) {
            foreach ($spec_v as $key => $value) {
                if(isset($value['markup']) && is_numeric($value['markup'])){
                    $data[$spec_k][$key]['markup'] = sprintf("%.2f",$value['markup']);
                }else{
                    return false;
                }
            }
        }
        return $data ? $data : false;
    }
}